//
//  XSNetworkReachabilityManager.m
//  XSDownloadDemo
//
//  Created by 大帅 on 2023/12/21.
//

#import "XSNetworkReachabilityManager.h"

@interface XSNetworkReachabilityManager ()

@property (nonatomic, assign, readwrite) AFNetworkReachabilityStatus networkReachabilityStatus;

@end

@implementation XSNetworkReachabilityManager

static XSNetworkReachabilityManager *_sharedSingleton = nil;

+ (instancetype)shareManager {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // 不能再使用 alloc 方法
        // 因为已经重写了 allocWithZone 方法，所以这里要调用父类的分配空间的方法
        _sharedSingleton = [[super allocWithZone:NULL] init];
    });
    return _sharedSingleton;
}

// 防止 [[A alloc] init] 和 new 引起的错误。因为 [[A alloc] init] 和 new 实际是一样的工作原理，都是执行了下面方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    return [XSNetworkReachabilityManager shareManager];
}

// NSCopying 防止 copy 引起的错误。当你的单例类不遵循 NSCopying 协议，外部调用本身就会出错.
- (id)copyWithZone:(nullable NSZone *)zone {
    return [XSNetworkReachabilityManager shareManager];
}

// 防止 mutableCopy 引起的错误，当你的单例类不遵循 NSMutableCopying 协议，外部调用本身就会出错.
- (id)mutableCopyWithZone:(nullable NSZone *)zone {
    return [XSNetworkReachabilityManager shareManager];
}

/// 监听网络状态
- (void)monitorNetworkStatus {
    // 创建网络监听者
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusReachableViaWiFi:
                // 无线网络
                NSLog(@"当前网络：Wi-Fi");
                break;
                
            case AFNetworkReachabilityStatusReachableViaWWAN:
                // 蜂窝网络
                NSLog(@"当前网络：蜂窝数据");
                break;
                
            case AFNetworkReachabilityStatusNotReachable:
                // 无线网络
                NSLog(@"当前网络：无网络");
                break;
                
            case AFNetworkReachabilityStatusUnknown:
                // 无线网络
                NSLog(@"当前网络：未知");
                break;
                
            default:
                break;
        }
        
        if (self.networkReachabilityStatus != status) {
            self.networkReachabilityStatus = status;
            // 发送网络改变通知
            [[NSNotificationCenter defaultCenter] postNotificationName:XSNetworkingChangeNotification object:nil userInfo:nil];
        }
    }];
    // 开始监听
    [manager startMonitoring];
    
}


@end
